package javaNIO1.buffer;

import org.checkerframework.checker.signedness.qual.Unsigned;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.CharBuffer;

/**
 * Created with Intel IDEA.
 *  字节缓冲区
 * @Auther: gjt
 * @Date: 2024/7/7 14:28
 */
public class byteBuffer1 {

    /**
     *  类型   字节大小
     *  Byte    1
     *  Char    2
     *  Short   2
     *  Int     4
     *  Long    8
     *  Float   4
     *  Double  8
     */

    // 多字节数值被存储在内存中的方式一般被称为 endian-ness (字节顺序)  大端（big end）和小端
    private static ByteBuffer buffer = ByteBuffer.allocate(100);
    public static void main(String[] args) {

        // 获取平台的固有字节顺序
        ByteOrder order = ByteOrder.nativeOrder();
        System.out.println("字节顺序" + order.toString());


        // ByteBuffer 的字节顺序默认是大端
        ByteOrder allocate = buffer.order();
        System.out.println("buffer 缓冲区的字节顺序： " + allocate);

        buffer.order(ByteOrder.LITTLE_ENDIAN);
        ByteOrder allocate1 = buffer.order();
        System.out.println("buffer改变后 缓冲区的字节顺序： " + allocate1);

        System.out.println("是否是直接缓冲区" + buffer.isDirect());
        viewBuffer();
    }

    /**
     *  非直接字节缓冲区可以被传递给通道，并且隐含的操作以下步骤
     *  （1）：创建临时的直接缓冲区对象
     *  （2）：将非直接缓冲区缓冲区的内容复制到临时直接缓冲区
     *  （3）：使用临时直接缓冲区操作IO
     *   (4): 临时缓冲区对象离开作用域，被回收
     *
     *   因此直接缓冲区是最好的选择
     *
     */
    private static void dirByteBuffer(){
        // 创建直接字节缓冲区
        ByteBuffer buffer1 = ByteBuffer.allocateDirect(100);
        System.out.println("是否是直接缓冲区" + buffer1.isDirect());
    }

    /**
     * 视图缓冲区： 维护自己的基本属性,并共享数据元素
     * 字节缓冲区允许创建视图来将byte 类型缓冲区数据映射到其他的原始数据类型
     */
    private static void viewBuffer(){
        // 创建一个byteBuffer 的字符视图
        ByteBuffer order = ByteBuffer.allocateDirect(7).order(ByteOrder.BIG_ENDIAN);
        CharBuffer charBuffer = order.asCharBuffer();
        order.put(0,(byte) 0);
        order.put(1,(byte) 'H');
        order.put(2,(byte) 0);
        order.put(3,(byte) 'i');
        order.put(4,(byte) 0);
        order.put(5,(byte) '!');
        order.put(6,(byte) 0);
        System.out.println(order.position()+"位置"+order.limit()+"上界,"+order.capacity()+"容量:" +order.toString() );
        System.out.println(charBuffer.position()+"位置"+charBuffer.limit()+"上界,"+charBuffer.capacity()+"容量:" +charBuffer.toString() );

        System.out.println(order.getChar());
    }
}
